from rest_framework.generics import ListAPIView
# ListAPIView 是返回列表数据
from home import models,serializers
#导入django缓存
from django.core.cache import cache
#导入setting文件
from django.conf import settings
from rest_framework.response import Response
# 访问量大且数据一段时间内较为固定的接口，可以做接口缓存
# 如何来做呢？
#   1.从缓存中拿，缓存中有数据直接返回，没有数据去查询数据库；
#   2.将数据库中查询的数据返回给前台，同时将查询的数据再次建立缓存。

class BannerListAPIView(ListAPIView):
    '''
    [:2]这个是banner图取前两张展示，所以这个地方做一个灵活的配置比较好,
    怎么做呢？
    步骤如下：
        1.settings--const.py
            #轮播图推荐数
            BANNER_COUNT = 3    推荐数量3张
        2.#导入setting文件
            from django.conf import settings
        3.然后配置settings.BANNER_COUNT
        在const.py文件中进行配置，后面维护只需要修改该文件，方便维护


    '''

    queryset = models.Banner.objects.filter(is_delete=False,is_show=True).order_by('-order')[:settings.BANNER_COUNT]
    serializer_class = serializers.BannerModelSerializer

    #重写get方法，
    # 导入drf中的Response；from rest_framework.response import Response
    def get(self, request, *args, **kwargs):
        banner_list = cache.get('banner_list')
        if not banner_list:
            print('走数据库拿数据')
            response = self.list(request, *args, **kwargs)
            print(type(response.data))
            # response.data不是json数据，是drf中的自定义ReturnList类
            # <class 'rest_framework.utils.serializer_helpers.ReturnList'>
            # 建立缓存key：banner_list；value：response.data

            cache.set('banner_list',response.data)  # 缓存不设置过期时间，更新任务交给celery异步任务框架

            print('建立缓存了')
            # 缓存不能设置过期时间，如果时间刚好过期了，几千个请求过来访问数据库，数据库立马就崩了
            return response
        return Response(banner_list)

'''
from celery_task.tasks import delay_sms
class SMSAPIView(ListAPIView):
    throttle_classes = [throttles.SMSRateThrottle]

    def post(self, request, *args, **kwargs):
        delay_sms.delay()   # 立即执行任务
        delay_sms.apply_async() #延迟执行任务

'''









